package com.cloudwise.service.impl;

import com.cloudwise.dao.RoleDao;
import com.cloudwise.dao.RoleMenuDao;
import com.cloudwise.dao.UserRoleDao;
import com.cloudwise.entity.*;
import com.cloudwise.service.RoleService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 角色信息表(Role)表服务实现类
 *
 * @author makejava
 * @since 2020-12-17 10:17:53
 */
@Service("roleService")
public class RoleServiceImpl implements RoleService {
    @Resource
    private RoleDao roleDao;
    @Resource
    private RoleMenuDao roleMenuDao;
    @Resource
    private UserRoleDao userRoleDao;

    /**
     * 通过ID查询单条数据
     *
     * @param roleId 主键
     * @return 实例对象
     */
    @Override
    public Role queryById(Integer roleId) {
        return this.roleDao.queryById(roleId);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<Role> queryAllByLimit(int offset, int limit) {
        return this.roleDao.queryAllByLimit(offset, limit);
    }

    @Override
    public List<Role> queryAll(Role role) {
        return roleDao.queryAll(role);
    }

    /**
     * 新增数据
     *
     * @param role 实例对象
     * @return 实例对象
     */
    @Override
    public Role insert(Role role) {
        this.roleDao.insert(role);
        return role;
    }

    /**
     * 修改数据
     *
     * @param role 实例对象
     * @return 实例对象
     */
    @Override
    public Role update(Role role) {
        this.roleDao.update(role);
        return this.queryById(role.getRoleId());
    }

    /**
     * 通过主键删除数据
     *
     * @param roleId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer roleId) {
        return this.roleDao.deleteById(roleId) > 0;
    }

    @Override
    public List<Role> selectListByUserId(Integer userId) {
        return roleDao.selectListByUserId(userId);
    }
    /**
     * @create by: Teacher陈
     * @description: 保存角色和对应的中间表
     * @create time: 2020/7/20 8:53
     * @param roleVo
     * @return boolean
     */
    @Override
    public boolean saveRoleAndMenus(RoleVo roleVo) {
        Role role = new Role();
        //使用spring自带工具类进行对象深度拷贝
        BeanUtils.copyProperties(roleVo,role);
        //操作tbl_role保存role
        Integer insert = roleDao.insert(role);
        if(insert>0){
            //操作tbl_role_menu中间表
            List<LayUiTree> layUiTreeList = roleVo.getMenus();
            //递归保存角色和菜单中间表
            recursionSaveRoleMenu( role , layUiTreeList);
            return true;
        }
        return false;
    }
    @Override
    public boolean updateRoleAndMenus(RoleVo roleVo) {
        Role role = new Role();
        //使用spring自带工具类进行对象深度拷贝
        BeanUtils.copyProperties(roleVo,role);
        //操作tbl_role保存role
        Integer update = roleDao.update(role);
        if(update>0){
            //删除tbl_role_menu中的数据
            roleMenuDao.deleteById(role.getRoleId());
            //操作tbl_role_menu中间表
            List<LayUiTree> layUiTreeList = roleVo.getMenus();
            //递归保存角色和菜单中间表
            recursionSaveRoleMenu( role , layUiTreeList);
            return true;
        }
        return false;
    }


    /**
     * @create by: Teacher陈
     * @description: 删除角色，并且把相关的用户中间表和菜单中间表也同时删除
     * @create time: 2020/7/19 21:10
     * @param role
     * @return boolean
     */
    @Override
    public boolean deleteRoleAndMenus(Role role) {
        int roleId=role.getRoleId();
        //删除role表中的记录
        Integer integer = roleDao.deleteById(roleId);
        //删除中间表中的记录
        if(integer>0){
            //删除tbl_role_menu中的数据
          /*  Wrapper<RoleMenu> wrapperRoleMenu = new EntityWrapper<>();
            wrapperRoleMenu.eq("role_id",roleId);
            roleMenuDao.delete(wrapperRoleMenu);*/
            roleMenuDao.deleteById(roleId);
            //删除tbl_user_role中的数据
            userRoleDao.deleteByRoleId(roleId);
            return true;
        }
        return false;
    }

    @Override
    public List<Integer> findMenuIdsByRoleId(Integer roleId) {

        return userRoleDao.findMenuIdsByRoleId(roleId);
    }


    /**
     * @create by: Teacher陈
     * @description: 递归保存角色和菜单中间表
     * @create time: 2020/7/19 18:09
     * @param role，layUiTreeList
     */
    public void recursionSaveRoleMenu(Role role ,List<LayUiTree> layUiTreeList){
        for (LayUiTree layUiTree : layUiTreeList) {
            //保存当前节点到数据库
            RoleMenu roleMenu = new RoleMenu();
            roleMenu.setRoleId(role.getRoleId());
            roleMenu.setMenuId(layUiTree.getId());
            roleMenuDao.insert(roleMenu);
            if(layUiTree.getChildren().size()>0){
                //如果有孩子节点，递归保存角色和菜单中间表
                recursionSaveRoleMenu( role , layUiTree.getChildren());
            }
        }
    }
}